package com.tedu.api.ee;


import org.junit.Test;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 流---傳輸數據---傳輸數據過程絕對不能出錯【處理手段】
 * 標準流結合異常---標準IO
 *
 * 異常
 * Java面向對象語言，程序中所出現的所有錯誤，定義為對象【處理對應錯誤】
 *
 * Trowable頂級異常超類
 *
 * Exception異常：描述程序级别的错误---有解决方案
 *               编译期：RunTimeException异常表示类
 *                      FileOutputStream创建对象---波浪线---抛出方法之外
 *               检查异常：通常都是编译期检查处理，程序直接报销，跑出
 *               解决方案：①捕获异常（*）
 *                       ②抛出异常---抛出方法之外---打印控制台
 *
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台异常对象名称，RunTimeException异常表示
 *               【throw与throws---RunTimeException】
 *
 * Error錯誤：描述程序級別的錯誤---出現---程序宕机
 *           非常低--->递归：自己调自己--->
 */
public class EE {
    /**
     * Error 错误---程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     * ----程序宕机----祸胎：9亿账号
     * while（true）{
     *     拼接字符串对象
     * }
     */
    public static void method() {
        method();

    }
    @Test
    public void testError(){
        EE.method();
    }

    /**
     * Exception异常：检查异常【出现编译期】---代码报波浪线
     *               两种处理手段：①捕获异常
     *                         语法：try{
     *                             怀疑代码可能有异常或者提示异常
     *                         }catch（小异常名字 e）{
     *                            e.printStacktrace();打印异常信息
     *                         }catch（中异常名字 e）{
     *                           e.printStacktrace();打印异常信息
     *                         }catch（大异常名字 e）{   Exception
     *                           e.printStacktrace();打印异常信息
     *                         }finally{
     *                             一定执行代码块
     *                         }
     *                         快捷键：ctrl+alt+T
     *
     *                           ②抛出异常  throws 异常名字【并未解决】
     *                考试题：throw与throws
     *               非检查异常【出现运行期】---代码无错误---控制台
     * ----------------
     * 异常：FileNotFoundException  文件不存在异常
     * 产生原因：路径写错，文件名写错
     * 异常:NUllPointerException  空指针异常
     * 产生原因：获取字符串为空，数组：值为空：集合：元素为空【存在null值】
     * 异常:StringIndex0ut0fBoundsException  字符串下标越界异常
     * 产生原因：字符串下标没有对应字符
     * 异常：NumberFormatException  数字转换异常
     * 产生原因：字符串不是正确的类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译期】---代码报波浪线线
//        FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---控制台
        try {
            String str = "a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str);//解析字符串--转换为对应类型
        }catch (StringIndexOutOfBoundsException e){
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常:下标越界异常");
        }
        catch (NumberFormatException e){
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("大异常");
        }
        finally {
            System.out.println("一定执行代码块");
        }



    }

    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示:查API---java.lang.异常
     * 字符串、包装类、集合、I0流
     */

    @Test
    public void testHomeWork1(){
        try {

        }catch (NullPointerException e){
            e.printStackTrace();
            System.out.println("空指针异常");
        }catch (ClassCastException e){
            e.printStackTrace();
            System.out.println("类型转换异常");
        }catch (UnsupportedOperationException e){
            e.printStackTrace();
            System.out.println("不支持的操作异常");
        }catch (NegativeArraySizeException e){
            e.printStackTrace();
            System.out.println("创建一个大小为负数的数组错误异常");
        }catch (RuntimeException e){
            e.printStackTrace();
            System.out.println("运行时异常");
        }finally {
            System.out.println();
        }
    }
}










